#include "user_global.h"
#include "crc.h"
#include <string.h>
#include "stdlib.h"
#include "device_usart.h"
#include "user_device.h"
#include "usart.h"
#include "user_config.h"
#include "tim.h"

#define MAX_READ_BIT            984             // 最大读取的RO/RW-bit数量
#define MAX_WRITE_BIT           952             // 最大写入的RW-bit数量
#define MAX_READ_WORD           61              // 最大读取的RO/RW-WORD数量
#define MAX_WRITE_WORD          59              // 最大写入的RW-WORD数量


uchar uart0_sendtimeout = 100;                    //串口发送超时时间,ms

uchar REN0 = 1;                                  //允许接收
uchar  uart0_dr;                                 // uart1要发送长度
uchar  uart0_len = 0;                            // 已接收/或要发送长度
uchar  uart0_buf[UART0_BUF_SIZE];                // uart0发送/接收缓冲区
ushort uart0_timestamp;                          // 最后接收时间
uchar *uart0_tx_ptr;                             // 发送指针
bit uart0_rx_pending = 0;                        // uart0正在接收标志
bit uart0_tx_pending = 0;                        // uart0正在发送标志
uchar  uart0_tx_len = 0;                         // uart1要发送长度
uchar  uart0_tx_buf[UART0_BUF_SIZE];             // uart1发送缓冲区


#ifdef _SCANNER_USES_UART1
uchar REN1 = 1;                                   //允许接收
uchar uart1_tx_left = 0;                          // uart1发送剩余长度
uchar uart1_tx_len = 0;                           // uart1要发送长度
uchar uart1_rx_len = 0;                           // uart1已接收长度
uchar uart1_tx_buf[UART1_BUF_SIZE];               // uart1发送缓冲区
uchar uart1_rx_buf[UART1_BUF_SIZE] = {0};               // uart1接收缓冲区
ulong uart1_timestamp;                            // 最后接收时间
ulong uart1_timestamp_long;                       // 最后发送时间
uchar * uart1_tx_ptr;                             // 发送指针
uchar uart1_retry_times = 0;                      // uart1重试次数
uchar uart1_result = UART1_RESULT_OK;             // uart1通讯结果, 见UART1_RESULT_xxx
bit uart1_rx_pending = 0;                         // uart1正在接收标志
bit uart1_tx_pending = 0;                         // uart1正在发送标志
bit uart1_locked = 0;                             // uart1访问锁定

// 数据备份
uchar uart1_tx_len_bak;                           // uart1发送长度备份
uchar uart1_rx_len_bak;                           // uart1接收长度备份
uchar uart1_tx_buf_bak[UART1_BUF_SIZE];           // uart1发送缓冲区备份
uchar uart1_rx_buf_bak[UART1_BUF_SIZE];           // uart1接收缓冲区备份
uchar uart1_result_bak;                           // uart1通讯结果备份
#endif

// uart0接收到了帧结束
bit Uart0_FrameEnded(void)
{
    return timer_flag_get(TIMER5, TIMER_FLAG_UP);
}

bit Uart0_Send_Message(void)
{
    HAL_StatusTypeDef hal_state;
    ushort interval;
    *(ushort*)&uart0_buf[uart0_len] = from_little_endian_16(calc_crc(uart0_buf, uart0_len));
    uart0_len += 2;

    // 距接收经过的时间
    interval = timer_counter_read(TIMER5) - uart0_timestamp;

    // 如果发送距接收时间不足2ms, 等待
    if (interval < TWO_MS)
        Delay_Tick(TWO_MS - interval);

    uart0_tx_pending = 1;
#ifndef USE_BY_ISP
    uart0_tx_ptr = uart0_buf;
    hal_state = USART0_Send_Date(uart0_buf,uart0_len);
#else
    uart0_tx_ptr = uart0_buf;
    sbuf0 = *uart0_tx_ptr++;
    USART_SendData(USART1, sbuf0);
    USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//因为是 发送寄存器空 的中断，所以发完字符串后必须关掉，否则只
    --uart0_len;
#endif

    if(hal_state != HAL_OK)
        return 0;
    return 1;
}

void USART0_Puts(char * str)
{
    while(*str)
    {
        while(RESET == usart_flag_get(USART2, USART_FLAG_TC));
        usart_data_transmit(USART2, (uchar)0x03);
        while(RESET == usart_flag_get(USART2, USART_FLAG_TBE));
        str++;
    }
}

HAL_StatusTypeDef USART0_Send_Date(uchar *data,uchar number)
{
    /* enable USART TBE interrupt */
    usart_interrupt_enable(USART2, USART_INT_TBE);
    return HAL_OK;
}

///////////////////////////////////////////////////////////////
/*! uart1 */

#define NO_EXCHANGE_MESSAGE
#define NO_READ_RWBIT
#define NO_READ_RWWORD
#define NO_WRITE_BIT
#define NO_READ_ROBIT
#define NO_READ_ROWORD
#define NO_READ_EVENT_COUNT
#define NO_BEGIN_WRITE_WORD
#define NO_READ_FILE

// uart1发送
void Uart1_Send()
{
    // 有可能正在发送, 等待发送完成
    while(uart1_tx_pending)
        Update_WatchDog();

    uart1_rx_pending = 0;
    uart1_tx_pending = 1;
    uart1_rx_len = 0;
    uart1_tx_ptr = uart1_tx_buf;
    uart1_tx_left = uart1_tx_len;

    // 根据协议, 发送前等待4字节时间@115200
    // Delay_us(400);

    // 开始发送
    usart_interrupt_enable(USART1, USART_INT_TBE);
}







